/****************************************************************************
 *
 * fttrigon.h
 *
 *   FreeType trigonometric functions (specification).
 *
 * Copyright (C) 2001-2019 by
 * David Turner, Robert Wilhelm, and Werner Lemberg.
 *
 * This file is part of the FreeType project, and may only be used,
 * modified, and distributed under the terms of the FreeType project
 * license, LICENSE.TXT.  By continuing to use, modify, or distribute
 * this file you indicate that you have read the license and
 * understand and accept it fully.
 *
 */

#ifndef FTTRIGON_H_
#define FTTRIGON_H_

#include FT_FREETYPE_H

#ifdef FREETYPE_H
#error "freetype.h of FreeType 1 has been loaded!"
#error "Please fix the directory search order for header files"
#error "so that freetype.h of FreeType 2 is found first."
#endif

FT_BEGIN_HEADER

/**************************************************************************
 *
 * @section:
 *  computations
 *
 */

/**************************************************************************
 *
 * @type:
 *   FT_Angle
 *
 * @description:
 *   This type is used to model angle values in FreeType.  Note that the
 *   angle is a 16.16 fixed-point value expressed in degrees.
 *
 */
typedef FT_Fixed FT_Angle;

/**************************************************************************
 *
 * @macro:
 *   FT_ANGLE_PI
 *
 * @description:
 *   The angle pi expressed in @FT_Angle units.
 *
 */
#define FT_ANGLE_PI (180L << 16)

/**************************************************************************
 *
 * @macro:
 *   FT_ANGLE_2PI
 *
 * @description:
 *   The angle 2*pi expressed in @FT_Angle units.
 *
 */
#define FT_ANGLE_2PI (FT_ANGLE_PI * 2)

/**************************************************************************
 *
 * @macro:
 *   FT_ANGLE_PI2
 *
 * @description:
 *   The angle pi/2 expressed in @FT_Angle units.
 *
 */
#define FT_ANGLE_PI2 (FT_ANGLE_PI / 2)

/**************************************************************************
 *
 * @macro:
 *   FT_ANGLE_PI4
 *
 * @description:
 *   The angle pi/4 expressed in @FT_Angle units.
 *
 */
#define FT_ANGLE_PI4 (FT_ANGLE_PI / 4)

/**************************************************************************
 *
 * @function:
 *   FT_Sin
 *
 * @description:
 *   Return the sinus of a given angle in fixed-point format.
 *
 * @input:
 *   angle ::
 *     The input angle.
 *
 * @return:
 *   The sinus value.
 *
 * @note:
 *   If you need both the sinus and cosinus for a given angle, use the
 *   function @FT_Vector_Unit.
 *
 */
FT_EXPORT(FT_Fixed)
FT_Sin(FT_Angle angle);

/**************************************************************************
 *
 * @function:
 *   FT_Cos
 *
 * @description:
 *   Return the cosinus of a given angle in fixed-point format.
 *
 * @input:
 *   angle ::
 *     The input angle.
 *
 * @return:
 *   The cosinus value.
 *
 * @note:
 *   If you need both the sinus and cosinus for a given angle, use the
 *   function @FT_Vector_Unit.
 *
 */
FT_EXPORT(FT_Fixed)
FT_Cos(FT_Angle angle);

/**************************************************************************
 *
 * @function:
 *   FT_Tan
 *
 * @description:
 *   Return the tangent of a given angle in fixed-point format.
 *
 * @input:
 *   angle ::
 *     The input angle.
 *
 * @return:
 *   The tangent value.
 *
 */
FT_EXPORT(FT_Fixed)
FT_Tan(FT_Angle angle);

/**************************************************************************
 *
 * @function:
 *   FT_Atan2
 *
 * @description:
 *   Return the arc-tangent corresponding to a given vector (x,y) in the 2d
 *   plane.
 *
 * @input:
 *   x ::
 *     The horizontal vector coordinate.
 *
 *   y ::
 *     The vertical vector coordinate.
 *
 * @return:
 *   The arc-tangent value (i.e. angle).
 *
 */
FT_EXPORT(FT_Angle)
FT_Atan2(FT_Fixed x, FT_Fixed y);

/**************************************************************************
 *
 * @function:
 *   FT_Angle_Diff
 *
 * @description:
 *   Return the difference between two angles.  The result is always
 *   constrained to the ]-PI..PI] interval.
 *
 * @input:
 *   angle1 ::
 *     First angle.
 *
 *   angle2 ::
 *     Second angle.
 *
 * @return:
 *   Constrained value of `angle2-angle1`.
 *
 */
FT_EXPORT(FT_Angle)
FT_Angle_Diff(FT_Angle angle1, FT_Angle angle2);

/**************************************************************************
 *
 * @function:
 *   FT_Vector_Unit
 *
 * @description:
 *   Return the unit vector corresponding to a given angle.  After the
 *   call, the value of `vec.x` will be `cos(angle)`, and the value of
 *   `vec.y` will be `sin(angle)`.
 *
 *   This function is useful to retrieve both the sinus and cosinus of a
 *   given angle quickly.
 *
 * @output:
 *   vec ::
 *     The address of target vector.
 *
 * @input:
 *   angle ::
 *     The input angle.
 *
 */
FT_EXPORT(void)
FT_Vector_Unit(FT_Vector *vec, FT_Angle angle);

/**************************************************************************
 *
 * @function:
 *   FT_Vector_Rotate
 *
 * @description:
 *   Rotate a vector by a given angle.
 *
 * @inout:
 *   vec ::
 *     The address of target vector.
 *
 * @input:
 *   angle ::
 *     The input angle.
 *
 */
FT_EXPORT(void)
FT_Vector_Rotate(FT_Vector *vec, FT_Angle angle);

/**************************************************************************
 *
 * @function:
 *   FT_Vector_Length
 *
 * @description:
 *   Return the length of a given vector.
 *
 * @input:
 *   vec ::
 *     The address of target vector.
 *
 * @return:
 *   The vector length, expressed in the same units that the original
 *   vector coordinates.
 *
 */
FT_EXPORT(FT_Fixed)
FT_Vector_Length(FT_Vector *vec);

/**************************************************************************
 *
 * @function:
 *   FT_Vector_Polarize
 *
 * @description:
 *   Compute both the length and angle of a given vector.
 *
 * @input:
 *   vec ::
 *     The address of source vector.
 *
 * @output:
 *   length ::
 *     The vector length.
 *
 *   angle ::
 *     The vector angle.
 *
 */
FT_EXPORT(void)
FT_Vector_Polarize(FT_Vector *vec, FT_Fixed *length, FT_Angle *angle);

/**************************************************************************
 *
 * @function:
 *   FT_Vector_From_Polar
 *
 * @description:
 *   Compute vector coordinates from a length and angle.
 *
 * @output:
 *   vec ::
 *     The address of source vector.
 *
 * @input:
 *   length ::
 *     The vector length.
 *
 *   angle ::
 *     The vector angle.
 *
 */
FT_EXPORT(void)
FT_Vector_From_Polar(FT_Vector *vec, FT_Fixed length, FT_Angle angle);

/* */

FT_END_HEADER

#endif /* FTTRIGON_H_ */

/* END */
